package com.pur.zsms.common.exception;

import java.sql.SQLException;


/**
 * <P>异常处理工厂类。 利用该类可以把其他异常转化为GenericException的子类。</P>
 * @author Colin Chen
 *
 */
public class ExceptionFactory {

	/** 由PL/SQL错误抛出公用程序P_ERROR抛出的错误, 注意此处为正 */
	private static final int PLSQL_ERROR_CODE = 20100;

	/** 最小的系统错误号码 */
	private static final int MIN_SYS_ERR_CODE = 1000000;

	/**
	 * 将一个普通错误转换成本系统的GenericException
	 * 
	 * @param e
	 *          普通错误
	 * @return 本系统的GenericException
	 */
	public static GenericException parse(Exception e) {
		e.printStackTrace();
		if (e instanceof SQLException) {
			SQLException se = (SQLException) e;
			int nErrorCode = se.getErrorCode();
			if (nErrorCode == PLSQL_ERROR_CODE) { // 由PL/SQL错误抛出公用程序P_ERROR抛出的错误,
				// 注意此处为正
				String sMsg = se.getMessage();
				String sAdditional = "";
				int nIndex = sMsg.indexOf(',');
				if (nIndex != -1) {
					String sMsg1 = sMsg.substring(0, nIndex);
					int nIndex1 = sMsg1.indexOf(' ');
					if (nIndex1 != -1) {
						sMsg1 = sMsg1.substring(nIndex1 + 1);
					}
					try {
						nErrorCode = new Integer(sMsg1).intValue();
					} catch (Exception ex) {
						ex.printStackTrace();
					}
					int nIndex2 = sMsg.indexOf('\n');
					if (nIndex2 != -1) {
						sAdditional = sMsg.substring(nIndex + 1, nIndex2);
					} else {
						sAdditional = sMsg.substring(nIndex + 1);
					}
				}
				if (nErrorCode == PLSQL_ERROR_CODE) {
					return new SystemException(sAdditional, e);
				} else if (nErrorCode < MIN_SYS_ERR_CODE) {
					return new ApplicationException(sAdditional, e);
				} else {
					return new SystemException(sAdditional, e);
				}
			} else {
				return new SystemException(e.getMessage(), e);
			}
		} else if (e instanceof SystemException) {
			return (SystemException) e;
		} else if (e instanceof ApplicationException) {
			return (ApplicationException) e;
		} else {
			return new SystemException(e.getMessage(), e);
		}
	}
}